MP04 - Just the Fact(-Check)s, Ma’am!
I. Executive Summary
On August 01, 2025, President Donald Trump fired Dr. Erika McEntarfer, Commissioner of the Bureau of Labor Statistics (BLS), stating his concerns about the size and direction of recent revisions to the monthly Current Employment Statistics (CES) “job numbers”.
The dismissal sparked bipartisan criticism from economists who warned that politicizing the Bureau of Labor Statistics could undermine the long-standing trust in federal statistics. Supporters of the agency noted that revisions are normal, expected, and built into the CES methodology.
Mini-Project 04 evaluates these competing claims, by analyzing data of CES revision patterns spanning nearly five decades. This is a nonpartisan, evidence-based analysis that recognizes both the methodological complexities and the important role that revisions play in improving the accuracy of federal labor statistics.
II. Data Acquisition and Preparation
This analysis draws on two primary data sources from the US Bureau of Labor Statistics:
- Final estimates of total nonfarm payroll employment
- Month-to-month revisions to those estimates
To construct the dataset of final CES employment levels, the “Total Nonfarm Payroll” series was programmatically retrieved using httr2 and rvest packages. The data were extracted from the BLS Data Finder, parsed from HTML, cleaned, and reshaped into a consistent monthly time series beginning in 1979.
Similarly, CES revision data was retrieved from a static BLS webpage using httr2 and rvest, then parsed, cleaned, and combined across years. For each month, revisions were calculated as the difference between the original and final published estimates.
Together, these steps produced a unified, fully automated dataset of CES employment levels and revisions covering January 1979 through June 2025.
III. Exploring CES Revisions: Trends and Patterns (1979-2025)
Q1. The graph below shows that from 1979 to 2025, revisions have been relatively stable with occasional fluctuations throughout this period. However, the largest CES revisions occurred in March 2020, with a negative revision of 672,000, and then in November 2021, with a positive revision of 437,000. These extremes reflect the unprecedented economic disruptions caused by the COVID-19 pandemic.
Q2. The fraction of positive CES revisions is shown below, highlighting fluctuations across 5-year periods starting from 1980. Some periods, such as 2010, exhibit a high fraction of positive revisions (80%), whereas others, like 1985, are much lower (38.3%). This demonstrates that CES revisions are not uniformly upward or downward and vary over time. The 2025 value is currently 0% because the data for that year are incomplete.
Code
# Display as interactive table
datatable(
fraction_5yr,
rownames = FALSE,
colnames = c(
"5-Year Period",
"Fraction Positive"
),
caption = htmltools::tags$caption(
style = 'caption-side: top; text-align: center; font-weight: bold; font-size: 14px;',
"Fraction of Positive CES Revisions by 5-Year Period (1980–2025)"
),
options = list(
dom = 't',
paging = FALSE,
ordering = FALSE,
autoWidth = TRUE
),
class = 'cell-border stripe',
callback = JS("
// Center body cells
table.columns().every(function(){
$(this.nodes()).css('text-align', 'center');
});
// Center header cells
$(table.table().header()).find('th').css('text-align', 'center');
// Reduce vertical padding
$(table.table().body()).find('td').css({
'padding-top': '4px',
'padding-bottom': '4px',
'line-height': '1.2'
});
$(table.table().header()).find('th').css({
'padding-top': '4px',
'padding-bottom': '4px',
'line-height': '1.2'
});
")
)
Q3. The graph below shows that the relative magnitude of CES revisions varies over time.Years with higher relative revisions indicate that initial CES estimates were less accurate, whereas lower values guess more reliable initial estimates. Overall, the data illustrate that revisions are a normal part of the CES process, with fluctuations often reflecting unusual economic events, such as recessions or pandemics.
Code
#Q3 How has the relative CES revision magnitude (absolute value of revision amount over final estimate) changed over time? (yearly)
ces_combined |>
mutate(relative_revision = abs(revision) / final) |>
group_by(year = lubridate::year(date)) |>
summarise(avg_relative_revision = mean(relative_revision, na.rm = TRUE))
#Visualization
ggplot(ces_combined, aes(x = date, y = level)) +
geom_line(color = "steelblue", linewidth = 0.5) +
labs(
title = "Evolution of U.S. Total Nonfarm Payrolls (1979-2025)",
x = "Year",
y = "Employment Level (Thousands)"
) +
scale_y_continuous(labels = scales::comma) +
theme_minimal(base_size = 9) +
theme(
plot.title = element_text(hjust = 0.5, size = 11, face = "bold"),
axis.title = element_text(size = 9),
axis.text = element_text(size = 8)
)
Q4.The plot shows the average absolute CES revision as a percentage of total employment for each year from 1979 to 2025. Higher values indicate years when initial CES estimates were proportionally less accurate, while lower values suggest more reliable estimates. Overall, the graph demonstrates that revisions are generally small relative to total employment, reinforcing our earlier findings.
Code
#Task 3 -Q4. How has the absolute CES revision as a percentage of overall employment level changed over time? (yearly)
ces_combined |>
mutate(revision_pct = (revision / level) * 100,
year = lubridate::year(date)) |>
group_by(year) |>
summarise(avg_revision_pct = mean(abs(revision_pct), na.rm = TRUE))
yearly_revision_pct <- ces_combined |>
mutate(
revision_pct = (revision / level) * 100,
year = lubridate::year(date)
) |>
group_by(year) |>
summarise(avg_revision_pct = mean(abs(revision_pct), na.rm = TRUE))
ggplot(yearly_revision_pct, aes(x = year, y = avg_revision_pct)) +
geom_area(fill = "lightsteelblue", alpha = 0.5) +
geom_line(color = "steelblue", linewidth = 0.5) + # thinner line
labs(
title = "Average Absolute CES Revision (% of Employment)",
subtitle = "Yearly Average (1979–2025)",
x = "Year",
y = "Average Absolute Revision (%)"
) +
theme_minimal(base_size = 9) + # smaller base font
theme(
plot.title = element_text(hjust = 0.5, size = 11, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 9),
axis.title = element_text(size = 9),
axis.text = element_text(size = 8)
)
Q5. Some months consistently experience larger CES revisions than others. March and April are typically impacted by annual benchmarking, leading to initial estimates being revised more heavily. Similarly, Septembers marks one of the seasonal transition months, as summer hiring comes to an end and back-to-school adjustments take place.
Code
#Task 3-Q5. Are there any months that systematically have larger or smaller CES revisions?
ces_combined |>
mutate(month = month(date, label = TRUE)) |> # extract month as factor (Jan, Feb, ...)
group_by(month) |>
summarise(avg_revision = mean(abs(revision), na.rm = TRUE)) |> # average absolute revision
arrange(desc(avg_revision))
monthly_avg <- ces_combined|>
mutate(month = lubridate::month(date, label = TRUE)) |>
group_by(month) |>
summarise(avg_revision = mean(abs(revision), na.rm = TRUE))
ggplot(monthly_avg, aes(x = month, y = avg_revision)) +
geom_col(fill = "lightsteelblue") +
labs(
title = "Monthly Average Variability of CES Revisions",
x = "Month",
y = "Average Revision (Thousands)"
) +
theme_minimal(base_size = 9) + # shrink overall plot scale
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 10),
axis.title = element_text(size = 8),
axis.text = element_text(size = 7)
)
Q6. On average, each month’s CES estimate is revised by approximately 57,000 jobs, either upward or downward, from the initial estimate to the final estimates. Relative to the total number of employed people reported to the CES, these revisions are quite small, representing only 0.05% of the total employment level. This shows that initial estimates are generally quite reliable as a measure of overall employment trends.
Code
#Task 3- Q6. Display as interactive table: How large is the average CES revision in absolute terms? In terms of percent of that month's CES level?
datatable(
avg_revisions,
rownames = FALSE,
options = list(
dom = 't',
pageLength = 1,
autoWidth = TRUE,
columnDefs = list(list(className = 'dt-center', targets = "_all"))
),
caption = htmltools::tags$caption(
style = 'caption-side: top; text-align: center; font-weight: bold; font-size: 14px;',
'Average Monthly CES Revisions: Absolute and Relative Magnitude (1979–2025)'
)
)IV. Statistical Analysis of CES Revisions
TEST #1:
IS THE AVERAGE REVISION DIFFERENT FROM ZERO?
A one-sample t-test shows that, on average, CES revisions increase initial employment estimates by roughly 11,500 jobs per month. The 95% confidence interval (4,570 to 18,530) and the small p-value (0.001) indicate that this result is statistically significant. Although this suggests a slight upward bias in initial CES reports, the magnitude of the revisions is small relative to total employment.
Code
#Task 4- Statistical Inference
#Q3- Is the average revision significantly different from zero?
#Performing t-test
# Perform t-test
t_test_result <- t.test(ces_combined$revision, mu = 0)
# Create table from t-test results
ttest_df <- data.frame(
Statistic = c("Mean", "Lower 95% CI", "Upper 95% CI", "t-value", "df", "p-value"),
Value = c(
round(t_test_result$estimate, 2),
round(t_test_result$conf.int[1], 2),
round(t_test_result$conf.int[2], 2),
round(t_test_result$statistic, 3),
round(t_test_result$parameter, 0),
signif(t_test_result$p.value, 3)
)
)
# Display table
kable(ttest_df, caption = "One-sample t-test results for CES revisions", align = "c") %>%
kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("striped", "hover", "condensed"))| Statistic | Value |
|---|---|
| Mean | 11.50000 |
| Lower 95% CI | 4.57000 |
| Upper 95% CI | 18.43000 |
| t-value | 3.25900 |
| df | 557.00000 |
| p-value | 0.00118 |
TEST #2:
HAS THE AVERAGE REVISION INCREASED POST-2020?
A two-sample t-test comparing average CES revisions before and after 2020 indicates that the mean revision post-2020 is higher (~13,000) than pre-2020 (450). However, the large p-value (0.758) and wide confidence interval (-42,250 to Inf) show that this difference is not statistically significant. Overall, there is no strong evidence that CES revisions have increased in the post-2020 period. on average, CES revisions increase initial employment estimates by roughly 11,500 jobs per month.
Code
# Task 4- Q4 - Prepare table for display
ttest_period_df <- data.frame(
Statistic = c("Mean (Pre-2020)", "Mean (Post-2020)", "t-value", "df", "p-value",
"Lower 95% CI", "Upper 95% CI"),
Value = c(
round(t_test_period$estimate[1], 2),
round(t_test_period$estimate[2], 2),
round(t_test_period$statistic, 3),
round(t_test_period$parameter, 0),
signif(t_test_period$p.value, 3),
round(t_test_period$conf.int[1], 2),
round(t_test_period$conf.int[2], 2)
)
)
# Display table with kable
kable(ttest_period_df, caption = "Two-sample t-test: Average CES Revisions Pre-2020 vs Post-2020", align = "c") %>%
kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("striped", "hover", "condensed"))| Statistic | Value |
|---|---|
| Mean (Pre-2020) | 0.450 |
| Mean (Post-2020) | 12.980 |
| t-value | -0.702 |
| df | 70.000 |
| p-value | 0.758 |
| Lower 95% CI | -42.250 |
| Upper 95% CI | Inf |
V. Fact Checks: What the Data Reveals About CES Revisions
CLAIM #1:
“When the data are unreliable, when they keep being revised all over the place, then there are going to be people that wonder if there’s a partisan pattern in the data.”
— Kevin Hassett, Director, National Economic Council (under President Trump) Source: The Hill, Aug 03, 2025
The plot below, which tracks the share of negative revisions, supports the stability of revisions over time. The proportion of downward revisions pre-2000 and post-2000 is nearly unchanged, which suggests the pattern of CES adjustments has been highly consistent for decades.
A separate two-sample test performed earlier in the analysis compared the fraction of negative CES revisions before and after 2020 to assess more recent changes. The test statistic (X2 = 0.608) and large p-value (0.782) indicate no meaningful statistical difference, while the confidence interval (-1.000 to 0.109) confirms that any gap is minimal. This reinforces the broader conclusion that CES revisions have remained stable over time.
Conclusion: These findings provide no evidence that revisions have suddenly become erratic or politically motivated, directly undermining the claim that CES revisions “are all over the place.”
Politifact Truth-O-Meter Rating: FALSE
CLAIM #2:
“CES revisions happen every month and always have. They are a sign of statistical transparency, not failure”.
— Jason Furman, Former Chair, Council of Economic Advisers
Source: X/Twitter, Aug 01, 2025
Monthly CES revisions occur consistently, but their size is generally small and stable over time. Earlier in the analysis, the “Evolution of US Total Nonfarm Payrolls” plot showed that these routine adjustments do not disrupt the long-run upward trend in employment.
The histogram of monthly CES revisions below reinforces this pattern: most revisions are modest and clustered near zero. This aligns with the one-sample t-test performed earlier, which indicate that revisions increase initial employment estimates by 11,500 jobs per month, with a 95% confidence interval ranging from 4,570 to 18,430, and a p-value of 0.001.
Code
# Task 4 Q3.-Visualize distribution
ggplot(ces_combined, aes(x = revision)) +
geom_histogram(binwidth = 50, fill = "steelblue", color = "white", alpha = 0.8) +
geom_vline(xintercept = 0, color = "red", linetype = "dashed", size = 0.8) +
scale_x_continuous(breaks = seq(-300, 300, by = 50)) +
coord_cartesian(xlim = c(-300, 300)) +
labs(
title = "Distribution of US Employment Revisions",
subtitle = "Red dashed line indicates zero revision",
x = "Monthly CES Revision (Thousands)",
y = "Frequency"
) +
theme_minimal(base_size = 9) +
theme(
plot.title = element_text(hjust = 0.5, size = 11, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 9),
axis.title = element_text(size = 9),
axis.text = element_text(size = 8)
)Conclusion: This distribution confirms that these revisions are a normal and expected part of the CES process, supporting Furman’s claim that revisions reflect statistical transparency rather than reporting failure.
Politifact Truth-O-Meter Rating: TRUE
VI. Behind the Numbers: How Computationally-Intensive Statistics Work
1. What is Computationally-Intensive Statistical Inference: A Non-Technical Explanation
Computationally intensive statistical inference is a modern approach that uses powerful computers to answer statistical questions when traditional formulas are too limited. Instead of relying on neat mathematical equations, these methods can handle large datasets, complex patterns, and situations where classical approaches breaks down.
Rather than assuming the data follows a perfect mathematical distribution, the computer repeatedly simulates new versions of the data. Techniques such as bootstrap, permutation tests, and Markov Chain Monte Carlo allow statisticans to approximate what would happen if we could “re-run” the world thousands of times under slightly different conditions.
By comparing our real result to the results from these simulated “what-if” worlds, we can see whether what we observed is unusual or just typical random variation. If a result rarely appears in the simulations, then it is unlikely to have occurred by chance in the real world.
2. How It Works: A Visual Representation
The flowchart below illustrates the step-by-step process behind computationally intensive statistical inference.
flowchart TD
%% Node styling
style A fill:#f0f8ff,stroke:#333,stroke-width:1px
style B fill:#f0f8ff,stroke:#333,stroke-width:1px
style C fill:#f0f8ff,stroke:#333,stroke-width:1px
style D fill:#f0f8ff,stroke:#333,stroke-width:1px
style E fill:#f0f8ff,stroke:#333,stroke-width:1px
style F fill:#f0f8ff,stroke:#333,stroke-width:1px
style G fill:#f0f8ff,stroke:#333,stroke-width:1px
style H fill:#f0f8ff,stroke:#333,stroke-width:1px
style I fill:#f0f8ff,stroke:#333,stroke-width:1px
style J fill:#f0f8ff,stroke:#333,stroke-width:1px
style K fill:#f0f8ff,stroke:#333,stroke-width:1px
%% Flow with wrapped text
A[Start with observed data] --> B[Define the question]
B --> C[Pick a simulation method - e.g., permutation, bootstrap, MCMC]
C --> D[Generate many new datasets]
D --> E[Calculate the statistic for each dataset]
E --> F[Form the simulated distribution]
F --> G[Compare the simulated statistic]
G --> H{Is the observed value unusual?}
H -- No --> I[Result likely due to chance] --> K[Final conclusion]
H -- Yes --> J[Result unlikely due to chance] --> K
%% Optional: thicker arrows
linkStyle default stroke:#2980B9, stroke-width:2px;
VII. Conclusion
The comprehensive analysis of nearly five decades of CES data demonstrates that monthly employment revisions are normal, expected, and a relatively small part of the Bureau Labor Statistic’s reporting process.
Revisions have been consistent over time, with patterns pre- and post-2020 being nearly identical. Statistical tests confirm no significant changes, undermining claims that CES data is erratic or politically influenced.
Larger than average revisions generally correspond to unusual economic events, such recessions, seasonal transitions, or the COVID-19 pandemic. This highlights the responsiveness of CES methodology to real-world conditions.
Moreover, simulation-based inference confirms that observed patterns are typical and not random, reinforcing confidence in the reliability of CES data.
Policymakers, economists, and most importantly, the public, can continue to rely on the trustworthiness of CES data and its methodology in measuring US labor market trends.
This work ©2025 by Ghirschhorn was initially prepared as a Mini-Project for STA 9750 at Baruch College. More details about this course can be found at the course site and instructions for this assignment can be found at MP #04